package br.com.sgi.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.sgi.enuns.EnumTipoIntencao;
import br.com.sgi.model.Acesso;
import br.com.sgi.model.Authority;
import br.com.sgi.model.Funcionalidade;
import br.com.sgi.service.AcessoService;
import br.com.sgi.service.AuthorityService;
import br.com.sgi.service.FuncionalidadeService;
import br.com.sgi.util.Mensagem;


@Controller("acessoBean")
@Scope("request")
public class AcessoBean extends BaseView {
	
	@Autowired
	private FuncionalidadeService funcionalidadeService;
	
	@Autowired
	private AcessoService acessoService;
	
	private Acesso acesso;
	
	@Autowired
	private AuthorityService authorityService;
	
	private List<Authority> listPerfis;
	
	private List<EnumTipoIntencao> listTipoIntecao;

	private List<Funcionalidade> funcionalidades;
	
	private Funcionalidade funcionalidadeSelecionada;
	
	private Authority perfil;
	
	private List<String> acessos;
	
	
	private List<SelectItem> listTipoAcessos;
	/**
	 * preenche lista com os status
	 * @return
	 */
	private List<SelectItem> preencherListaStatusSelItens(){
		SelectItem item = null;
		List<SelectItem> listTempSelectItens = new ArrayList<SelectItem>();
		acessos = new ArrayList<String>();
		if(perfil != null && funcionalidadeSelecionada != null)
			acesso = acessoService.buscarAcessoPorPerfil(perfil.getAuthority(), funcionalidadeSelecionada.getNome());
		if(acesso == null){
			acesso = new Acesso();
			acesso.setExibirEditar(false);
			acesso.setExibirExcluir(false);
			acesso.setExibirNoMenu(false);
			acesso.setExibirNovo(false);
			acesso.setExibirSalvar(false);
		}else{
				if(acesso.getExibirEditar())
					acessos.add(EnumTipoIntencao.EXIBIR_EDITAR.getCodigo());
				if(acesso.getExibirExcluir())
					acessos.add(EnumTipoIntencao.EXIBIR_EXCLUIR.getCodigo());
				if(acesso.getExibirNoMenu())
					acessos.add(EnumTipoIntencao.EXIBIR_NO_MENU.getCodigo());
				if(acesso.getExibirNovo())
					acessos.add(EnumTipoIntencao.EXIBIR_NOVO.getCodigo());
				if(acesso.getExibirSalvar())
					acessos.add(EnumTipoIntencao.EXIBIR_CADASTRAR.getCodigo());
		   }
		
		for(EnumTipoIntencao tipoIntencao :EnumTipoIntencao.values()){
			item = new SelectItem();
			item.setLabel(tipoIntencao.getDescricao());
			item.setValue(tipoIntencao.getCodigo());
			listTempSelectItens.add(item);
		}
		
		return listTempSelectItens;
	}
	public List<String> getAcessos() {
		if(acessos == null){
			acessos =  new ArrayList<String>();
		}
		return acessos;
	}
	
	public void salvar(){
		if(acesso == null)
			acesso = new Acesso();
		
		acesso.setAuthority(perfil);
		acesso.setFuncionalidade(funcionalidadeSelecionada);
		if(acessos.contains(EnumTipoIntencao.EXIBIR_EDITAR.getCodigo()))
			acesso.setExibirEditar(true);
		else
			acesso.setExibirEditar(false);
		
		if(acessos.contains(EnumTipoIntencao.EXIBIR_EXCLUIR.getCodigo()))
			acesso.setExibirExcluir(true);
		else
			acesso.setExibirExcluir(false);
		
		if(acessos.contains(EnumTipoIntencao.EXIBIR_NO_MENU.getCodigo()))
			acesso.setExibirNoMenu(true);
		else
			acesso.setExibirNoMenu(false);
		
		if(acessos.contains(EnumTipoIntencao.EXIBIR_NOVO.getCodigo()))
			acesso.setExibirNovo(true);
		else
			acesso.setExibirNovo(false);
		
		if(acessos.contains(EnumTipoIntencao.EXIBIR_CADASTRAR.getCodigo()))
			acesso.setExibirSalvar(true);
		else
			acesso.setExibirSalvar(false);
		
		if(acesso.getCoSeqAcesso() == null)
			acessoService.salvar(acesso);
		else
			acessoService.update(acesso);
		
		Mensagem.infoMsg("sucesso.MGS_03");
	}
	
	public void limparFuncionalidadesSelecionada(){
		funcionalidadeSelecionada = null;
	}
	
	public void setAcessos(List<String> acessos) {
		this.acessos = acessos;
	}
	public List<SelectItem> getListTipoAcessos() {
		
			listTipoAcessos = preencherListaStatusSelItens();
		return listTipoAcessos;
	}
	public void setListTipoAcessos(List<SelectItem> listTipoAcessos) {
		this.listTipoAcessos = listTipoAcessos;
	}
	public List<Funcionalidade> getFuncionalidades() {	
		if(funcionalidades == null)
			funcionalidades = funcionalidadeService.buscarTodasFuncionalidade();
		return funcionalidades;
	}
	public void setFuncionalidades(List<Funcionalidade> funcionalidades) {
		this.funcionalidades = funcionalidades;
	}
	
	
	public Funcionalidade getFuncionalidadeSelecionada() {
		return funcionalidadeSelecionada;
	}
	public void setFuncionalidadeSelecionada(Funcionalidade funcionalidadeSelecionada) {
		this.funcionalidadeSelecionada = funcionalidadeSelecionada;
	}
	public List<Authority> getListPerfis() {
		if(listPerfis == null)
			listPerfis = authorityService.buscarTodasAuthority();
		return listPerfis;
	}
	public void setListPerfis(List<Authority> listPerfis) {
		this.listPerfis = listPerfis;
	}
	public Authority getPerfil() {
		return perfil;
	}
	public void setPerfil(Authority perfil) {
		acessos = new ArrayList<String>();
		this.perfil = perfil;
	}
	
	/**
	 * @return the acesso
	 */
	public Acesso getAcesso() {
		return acesso;
	}
	/**
	 * @param acesso the acesso to set
	 */
	public void setAcesso(Acesso acesso) {
		this.acesso = acesso;
	}
	
	
	
	

}
